Rakennan iOS-peliä. Jokainen pelihuone on rakennettu kahdesta käyttäjästä. Kun kaksi käyttäjää on löytänyt vastaavuuden, näytän "odottaa vastausta" -ajastinta molemmissa laitteissa: heidän on napsautettava "Olen valmis" -painiketta 8 sekunnin kuluessa, tai molemmat potkaistaan huoneesta + poistetaan Firebasesta . Käyttäjien oikea tila (ennen kuin kukin heistä napsauttaa "Olen valmis" -painiketta): Vanhempi Ottelut Käyttäjä 1 vastustaja: Käyttäjä2 osoita: "NotReady" Käyttäjä 2 vastustaja: Käyttäjä1 osoita: "NotReady" Kriittinen huomautus - Ajastin molemmilla laitteilla aikaero on + -2 sekuntia, Toisin sanoen - kun laitteen ajastin päättyy ennen toista Kun käyttäjä painaa "Olen valmis" -painiketta, päivitän tilaa: "userReady" ja tarkista, onko toinenkin käyttäjä valmis (tarkkailemalla sen tilan arvoa). Jos molemmat käyttäjät ovat userReady - peli päällä. ONGELMA joten olemme jo selvittäneet, että 100 prosentissa tapauksista minulla on pieni aikaero molempien laitteiden välillä. MUTTA, jos esimerkiksi Käyttäjä1 napsautti Olen valmis -painiketta. Joten nyt User2 sai ChildUpdate-tapahtuman, ja sikäli kuin hän tietää - User2 on täysin valmis pelaamaan. User1-ajastin päättyy ensin (tosiasia), joten kun hänen ajastin päättyy, User2-ajastin pysyy 1 sekunnin ajan. NYT, User1-aika saavutti juuri nollan, joten hänet potkaistiin huoneesta ja lähetettiin RemoveValue-tapahtuma jokaiselle Käyttäjäsolmulle. Kun näin tapahtuu, tällä hyvin pienellä "aukolla" (User1-ajastimen nolla-ajan, User2-kellon näyttämisen 1 sekunti (tosiasia) välillä - ja hän painaa valmis-painiketta. Kuin hän ajattelee, että User1 on valmis pelaamaan, ja hän myös - kuin peli alkaa pelata. Lopputulokset - Molemmat pelaajat poistettiin Firebasesta Käyttäjä1 on poissa huoneesta User2 aloittaa pelin (ja luulee olevansa vastustaja) Kuinka voin ratkaista tämän lopputuloksen? Olen jo yrittänyt kutsua startGame-toimintoa vasta, kun "UpdateChild-tila" on valmis, mutta se silti pääsee sisään, ehkä siksi, että updateChild- ja removeValue-tilaukset ovat? Mitään ehdotuksia? Ja iso kiitos Firebase-tiimille siitä, että saavutit miten koko ajan !!!
2021-01-21 08:11:28
Ei ole järkevää, että käyttäjä 1 hyväksyy ja sitten vanhenee joka tapauksessa. Käyttäjän 2 pitäisi olla vanhentuva, jos aikaraja saavutetaan eikä hän ole vielä hyväksynyt. Tämän estämiseksi etsit tapahtumia. Kun "vanhenet" käyttäjän, tee se tapahtuman avulla, jotta tietoristiriitoja ei ole. var ref = uusi Firebase ("https: //.firebaseio.com /"); ref.child ('Parent / Matches'). child (user1) .tranzaction (function (currentValue) { if (currentValue && currentValue.state === 'NotReady') { return null; // poista käyttäjä } muu { paluu määrittelemätön; // keskeytä tapahtuma; tila muuttui, kun yritimme poistaa sitä } }); Mahdollisesti oikea nopeasti: var ref = Firebase (URL: "https: // .firebaseio.com / Vanhempi / Tulitikut /